1、合并二叉树，将2课二叉树合并为一颗
思想：前序遍历加递归
前序遍历将2课数的根val相加，直到2棵树的根val都为空 才停
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    TreeNode* _mergeTrees(TreeNode* root1, TreeNode* root2)
    {
         if(root1==nullptr&&root2==nullptr)
            return nullptr;
        TreeNode* root=new TreeNode(root1->val+root2->val);
        if(root1->left||root2->left)
            root->left=mergeTrees(root1->left,root2->left);
        else
            root->left=nullptr;
        if(root1->right||root2->right)
            root->right=mergeTrees(root1->right,root2->right);
        else
            root->right=nullptr;
        return root;
    }
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1==nullptr&&root2==nullptr)
            return nullptr;
        if(root1==nullptr)
            return root2;
        if(root2==nullptr)
            return root1;
        return _mergeTrees(root1,root2);
    }
};

2、机器人运动范围
思想：只要确保运动的行小于m，列小于n，并且坐标位相加小于k即可，但是注意一点，就是得用个数组来表示某坐标是否运动过了
class Solution {
public:

    int visit[101][101]={0};
    //计算每个位得和
    bool sum(int i,int j,int k)
    {
        return (i/10+i%10+j/10+j%10)>k;
    }

    int dfs(int i,int j,int m,int n,int k)
    {
        if(j<0||i<0||i>=m||j>=n||sum(i,j,k)||visit[i][j])
            return 0;
        //将i,j的下标表示已经来过了
        visit[i][j]=1;
        return 1+dfs(i+1,j,m,n,k)+dfs(i,j+1,m,n,k);
    }
    int movingCount(int m, int n, int k) {

        return dfs(0,0,m,n,k);
    }
};

3、实现pow，不能调用库函数
思想：x^n次方，可以将n变为2进制，那样就等于x^(1b1+2b2+...+2^(m-1)bm);
这样只需要利用位运算求出n的每一位为1还是0，为1，则有2的次方，为0则为1；
但是有一点需要注意
就是int型的范围，负数如果转为正数，那么回超范围，所以需要提前将int转为long  避免负数转正数超范围情况
class Solution {
public:
    double myPow(double x, int n) {
        if(n==0)
            return 1;
        long b=n;//因为n可能为负数
        if(b<0)
        {
            x=1/x;
            b=-b;
        }
        double ret=1.0;
        while(b>0)
        {
            if(b&1)
                ret*=x;
            x=x*x;
            b=b>>1;
        }
        return ret;

    }
};